package com.example.wexcle.demos.web.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *
 */
@Configuration
public class EasyExcelThreadPoolExecutor {
    /**
     * 线程池配置(另一种方式)
     * 不够完美
     */
    @Bean(name = "threadPoolExecutor")//Bean的ID是threadPoolExecutor
    public ThreadPoolExecutor easyExcelFileImportThreadPool() {
        //这个调用返回JVM可用的处理器数量。这是确定线程池大小的一个重要因素，因为线程池的大小应该与系统的处理能力相匹配
        int processors = Runtime.getRuntime().availableProcessors();
        //processors + 1核心线程数被设置为处理器数量加一。这意味着线程池在空闲时会保持这么多线程运行。
        return new ThreadPoolExecutor(processors + 1,// 核心线程数
                //processors * 2 + 1：最大线程数被设置为处理器数量的两倍加一。这是线程池能够容纳的最大线程数。
                processors * 2 + 1,// 最大线程数
                //10 * 60：线程空闲时间被设置为10分钟。如果线程池中的线程数量超过了核心线程数，并且这些线程在空闲时间内没有处理任何任务，它们将被终止并从池中移除。
                10 * 60,// 线程空闲时间
                TimeUnit.SECONDS,// 线程空闲时间的单位
                // 工作队列是一个LinkedBlockingQueue实例，其容量为1000000。这个队列用于存储等待执行的任务。如果所有的核心线程都在忙，新任务将被放入这个队列中等待执行。
                new LinkedBlockingQueue<>(1000000));// 工作队列
    }
}